
#ifndef _VIDEO_MANAGER_H
#define _VIDEO_MANAGER_H

#include <linux/videodev2.h>
#include "pic_operation.h"

#define NB_BUFFER 4   /* 视频缓冲区数量 */
/* 两结构体互相包含，故先声明*/
struct VideoDevice;        /*Video设备描述结构体 设备初始化函数中被赋值 */
struct VideoOpr;           /*Video设备操作结构体*/
typedef struct VideoDevice T_VideoDevice, *PT_VideoDevice;
typedef struct VideoOpr T_VideoOpr, *PT_VideoOpr;

/* Video图像数据结构体 */
typedef struct VideoBuf {
    T_PixelDatas tPixelDatas;
    uint32_t iPixelFormat;
}T_VideoBuf, *PT_VideoBuf;

/*Video设备描述结构体*/
struct VideoDevice {
    int iFd;                                  /*设备节点文件描述符*/
    uint32_t iPixelFormat;                /*图像格式*/
    int iWidth;                               /*图像分辨率*/
    int iHeight;
    int iVideoBufCnt;                         /*帧缓冲区数量*/
    int iVideoBufMaxLen;                      /*缓冲区最大长度*/
    int iVideoBufCurIndex;                    /*当前缓冲区索引*/
    uint8_t *pucVideBuf[NB_BUFFER];     /*帧缓冲首地址*/
    /* 函数 */
    PT_VideoOpr ptOPr;                        /*摄像头设备函数结构体*/
};
/*Video设备操作结构体*/
struct VideoOpr {
    char *name;                                                             /* 设备名称 */
    int (*InitDevice)(char *strDevName, PT_VideoDevice ptVideoDevice);      /* 初始化函数*/
    int (*ExitDevice)(PT_VideoDevice ptVideoDevice);                        /*关闭当前设备*/
    int (*GetFrame)(PT_VideoDevice ptVideoDevice, PT_VideoBuf ptVideoBuf);  /*得到一帧图像*/
    int (*GetFormat)(PT_VideoDevice ptVideoDevice);                         /*获得图像格式*/
    int (*PutFrame)(PT_VideoDevice ptVideoDevice, PT_VideoBuf ptVideoBuf);  /*释放一帧*/
    int (*StartDevice)(PT_VideoDevice ptVideoDevice);                       /*开始视频采集*/
    int (*StopDevice)(PT_VideoDevice ptVideoDevice);                        /*停止视频采集*/
    struct VideoOpr *ptNext;
};

int VideoDeviceInit(char *strDevName, PT_VideoDevice ptVideoDevice);   /* Video设备初始化函数*/
int V4l2Init(void);                                                    
int RegisterVideoOpr(PT_VideoOpr ptVideoOpr);
int VideoInit(void);
PT_VideoOpr GetVideoOpr(char *pcName);


#endif /* _VIDEO_MANAGER_H */

